package com.bestcem.xm.label.dao.mapper;

import com.bestcem.xm.label.entity.mysql.LabelValueEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * 标签值的Mapper
 *
 * @author zh.zhang <zh.zhang@idiaoyan.com>
 * @version v1.0
 * @date 2021-09-23
 */
@Mapper
public interface LabelValueMapper {
    /**
     * 更新标签值的标签组名称
     *
     * @param name
     * @param id
     * @param updateTime
     */
    void updateLabelGroupNameByLabelGroupId(@Param("labelGroupName") String name,
                                            @Param("labelGroupId") String id,
                                            @Param("updateTime") Date updateTime);

    /**
     * 删除 该标签组下所有的标签值
     *
     * @param labelGroupId
     */
    void deleteByLabelGroupId(@Param("labelGroupId") String labelGroupId);

    /**
     * 创建 标签值
     *
     * @param entity
     */
    void createLabelValue(LabelValueEntity entity);

    /**
     * 批量创建标签值
     *
     * @param labelValueEntities 标签值集合
     */
    void batchCreate(List<LabelValueEntity> labelValueEntities);

    /**
     * 根据id获取标签值
     *
     * @param labelValueId
     * @return
     */
    LabelValueEntity findById(@Param("id") String labelValueId);

    /**
     * 根据 标签id 统计数据
     *
     * @param labelId
     * @return
     */
    Integer countByLabelId(@Param("labelId") String labelId);

    /**
     * 根据标签id 获取数据
     *
     * @param labelId
     * @return
     */
    List<LabelValueEntity> findByLabelId(@Param("labelId") String labelId);

    /**
     * 根据 id 列表删除标签值
     *
     * @param labelValueIds
     */
    void deleteByIds(@Param("list") List<String> labelValueIds);

    /**
     * 更新标签的冗余信息
     *
     * @param toEntity
     */
    void updateLabelInfo(LabelValueEntity toEntity);

    /**
     * 更新标签值信息
     *
     * @param updateValue
     */
    void updateLabelValue(LabelValueEntity updateValue);

    /**
     * 根据 标签值名称 标签组id 标签id 获取数据
     *
     * @param value
     * @param labelGroupId
     * @param labelId
     * @return
     */
    LabelValueEntity findByValueAndLabelGroupIdAndLabelId(@Param("value") String value,
                                                          @Param("labelGroupId") String labelGroupId,
                                                          @Param("labelId") String labelId);

    /**
     * 更新标签值信息
     *
     * @param toEntity
     */
    void update(LabelValueEntity toEntity);

    /**
     * 根据标签值名称和标签id获取数据
     *
     * @param value
     * @param labelId
     * @return
     */
    List<LabelValueEntity> findByValueAndLabelId(@Param("value") String value, @Param("labelId") String labelId);

    /**
     * 根据id 更新序号
     *
     * @param serial
     * @param id
     */
    void updateSeqById(@Param("seq") Integer serial, @Param("id") String id, @Param("updateTime") Date updateTime);

    /**
     * 根据 id 列表获取数据
     *
     * @param ids
     * @return
     */
    List<LabelValueEntity> findByIds(@Param("list")List<String> ids);

    /**
     * 根据组织id 和 联系人类型获取数据
     *
     * @param orgId
     * @param memberType
     * @return
     */
    List<LabelValueEntity> findByOrgIdAndMemberType(@Param("orgId") String orgId, @Param("memberType") Integer memberType);

    /**
     * 根据组织id 和 联系人类型获取数据
     *
     * @param orgId
     * @param memberType
     * @return
     */
    List<LabelValueEntity> findByOrgIdAndMemberTypeSortBySerial(@Param("orgId") String orgId, @Param("memberType") Integer memberType);

    /**
     * 统计
     *
     * @param orgId
     * @param autoValue
     * @return
     */
    Integer countByOrgIdAndAuto(@Param("orgId") String orgId, @Param("autoValue") Integer autoValue);

    /**
     * 根据 orgId 和 autoValue 分页查询
     *
     * @param orgId
     * @param autoValue
     * @param start
     * @param size
     * @return
     */
    List<LabelValueEntity> findByOrgIdAndAuto(@Param("orgId") String orgId,
                                              @Param("autoValue") Integer autoValue,
                                              @Param("start") int start,
                                              @Param("size") int size);

    /**
     * 获取标签值列表
     *
     * @param orgId
     * @param labelId
     * @param autoValue
     * @return
     */
    List<LabelValueEntity> findByOrgIdAndLabelIdAndAuto(@Param("orgId") String orgId,
                                                        @Param("labelId") String labelId,
                                                        @Param("autoValue") Integer autoValue);

    /**
     * 批量添加行业sample数据
     *
     * @param labelValueEntities
     */
    void batchSaveSampleData(@Param("list") List<LabelValueEntity> labelValueEntities);

    /**
     * 根据组织id 和 标签id 统计数量
     *
     * @param orgId
     * @param labelId
     * @return
     */
    Integer countByOrgIdAndLabelId(@Param("orgId") String orgId, @Param("labelId") String labelId);

    /**
     * 删除该组织 标签下的标签值
     *
     * @param orgId
     * @param labelId
     */
    void deleteByOrgIdAndLabelId(@Param("orgId") String orgId, @Param("labelId") String labelId);

    /**
     * 更新标签值的标签组名称
     *
     * @param name
     * @param id
     * @param orgId
     * @param updateTime
     */
    void updateLabelGroupNameByLabelGroupIdAndOrgId(@Param("labelGroupName") String name,
                                                    @Param("labelGroupId") String id,
                                                    @Param("orgId") String orgId,
                                                    @Param("updateTime") Date updateTime);

    /**
     * 根据组织id 和 标签id 获取标签值列表
     *
     * @param orgId
     * @param labelIds
     * @return
     */
    List<LabelValueEntity> findByLabelIdsAndOrgId(@Param("orgId") String orgId, @Param("list") List<String> labelIds);

    /**
     * 根据标签id 批量删除标签值
     *
     * @param orgId
     * @param memberType
     * @param deleteValuesLabelIds
     */
    void batchDeleteByLabelIds(@Param("orgId") String orgId, @Param("memberType") int memberType, @Param("list") List<String> deleteValuesLabelIds);

    /**
     * 批量创建
     *
     * @param labelValueEntities
     */
    void batchSave(@Param("list") List<LabelValueEntity> labelValueEntities);

    /**
     * 根据 标签值id列表统计数量
     *
     * @param ids
     * @return
     */
    long countByIds(@Param("list") Set<String> ids);

    List<LabelValueEntity> findBySamplePaging(long offset, int limit);
}
